#!/bin/sh

MOD_NAME=zabbix_agent
MOD_DEFAULTS=/opt/$MOD_NAME/etc/defaults
MOD_SETTINGS=/opt/$MOD_NAME/etc/settings
[ -L "$MOD_SETTINGS" ] && MOD_SETTINGS=`readlink $MOD_SETTINGS`

DAEMON_NAME=zabbix_agentd
DAEMON_BIN=/opt/$MOD_NAME/bin
DAEMON_TMP=/run/$MOD_NAME
DAEMON_CONFIG=$DAEMON_TMP/$DAEMON_NAME.conf

[ -f "$MOD_SETTINGS" ] || cp $MOD_DEFAULTS $MOD_SETTINGS
[ -x "/sbin/hash_verify" ] && [ ! -f "$MOD_SETTINGS.hash" ] && cp $MOD_DEFAULTS.hash $MOD_SETTINGS.hash

. $MOD_SETTINGS

case "$1" in

  start|restart)
    [ -x "/sbin/hash_verify" ] && ! hash_verify $MOD_SETTINGS && exit 1

    if [ "$1" = "restart" ]; then
      echo -n "Restarting module $MOD_NAME: "
      killall $DAEMON_NAME 2>/dev/null
    else
      echo -n "Starting module $MOD_NAME: "
    fi
    if [ "$MOD_ZABBIXAG_ENABLED" != "1" ]; then
      echo "skipped"
      exit 0
    fi

    mkdir -p $DAEMON_TMP
    echo "AllowRoot=1"                                  > $DAEMON_CONFIG
    echo "PidFile=$DAEMON_TMP/zabbix_agentd.pid"        >> $DAEMON_CONFIG
    echo "DebugLevel=3"                                 >> $DAEMON_CONFIG
    echo "LogType=system"                               >> $DAEMON_CONFIG
    # general configuration
    echo "EnableRemoteCommands=$MOD_ZABBIXAG_ALLOW_REMOTE_COMMANDS" >> $DAEMON_CONFIG
    # passive checks
    if [ ! -z "$MOD_ZABBIXAG_LISTEN_PORT" ]; then
      echo "ListenPort=$MOD_ZABBIXAG_LISTEN_PORT"       >> $DAEMON_CONFIG
    fi
    if [ ! -z "$MOD_ZABBIXAG_ACCEPT_SERVERS" ]; then
      echo "Server=$MOD_ZABBIXAG_ACCEPT_SERVERS"        >> $DAEMON_CONFIG
      echo "StartAgents=1"                              >> $DAEMON_CONFIG
      if [ "$MOD_ZABBIXAG_ACCEPT_UNENCRYPTED" == "1" ]; then TLS_ACCEPT="$TLS_ACCEPT,unencrypted"; fi
      if [ "$MOD_ZABBIXAG_ACCEPT_PSK" == "1" ];         then TLS_ACCEPT="$TLS_ACCEPT,psk"; fi
      if [ "$MOD_ZABBIXAG_ACCEPT_CERT" == "1" ];        then TLS_ACCEPT="$TLS_ACCEPT,cert"; fi
      echo "TLSAccept=${TLS_ACCEPT:1}"                  >> $DAEMON_CONFIG
    else
      echo "StartAgents=0"                              >> $DAEMON_CONFIG
    fi
    # active checks
    if [ ! -z "$MOD_ZABBIXAG_CONNECT_SERVERS" ]; then
      echo "ServerActive=$MOD_ZABBIXAG_CONNECT_SERVERS" >> $DAEMON_CONFIG
      echo "TLSConnect=$MOD_ZABBIXAG_ENCRYPT_CONNECTION" >> $DAEMON_CONFIG
      if [ ! -z "$MOD_ZABBIXAG_ACTIVE_REFRESH" ]; then
        echo "RefreshActiveChecks=$MOD_ZABBIXAG_ACTIVE_REFRESH" >> $DAEMON_CONFIG
      fi
      if [ ! -z "$MOD_ZABBIXAG_BUFFER_SEND" ]; then
        echo "BufferSend=$MOD_ZABBIXAG_BUFFER_SEND" >> $DAEMON_CONFIG
      fi
      if [ ! -z "$MOD_ZABBIXAG_BUFFER_SIZE" ]; then
        echo "BufferSize=$MOD_ZABBIXAG_BUFFER_SIZE" >> $DAEMON_CONFIG
      fi
    fi
    if [ ! -z "$MOD_ZABBIXAG_HOSTNAME" ]; then
      echo "Hostname=$MOD_ZABBIXAG_HOSTNAME"            >> $DAEMON_CONFIG
    fi
    # credentials
    if [ ! -z "$MOD_ZABBIXAG_PSK_IDENTITY" ]; then
      echo "TLSPSKIdentity=$MOD_ZABBIXAG_PSK_IDENTITY"  >> $DAEMON_CONFIG
    fi
    if [ ! -z "$MOD_ZABBIXAG_PSK" ]; then
      echo -n "$MOD_ZABBIXAG_PSK" > $DAEMON_TMP/zabbix_psk.txt
      echo "TLSPSKFile=$DAEMON_TMP/zabbix_psk.txt"      >> $DAEMON_CONFIG
    fi
    if [ ! -z "$MOD_ZABBIXAG_CA_CERT" ]; then
      decode $MOD_ZABBIXAG_CA_CERT > $DAEMON_TMP/ca.pem
      echo "TLSCAFile=$DAEMON_TMP/ca.pem"               >> $DAEMON_CONFIG
    fi
    if [ ! -z "$MOD_ZABBIXAG_LOCAL_CERT" ]; then
      decode $MOD_ZABBIXAG_LOCAL_CERT > $DAEMON_TMP/local.pem
      echo "TLSCertFile=$DAEMON_TMP/local.pem"          >> $DAEMON_CONFIG
    fi
    if [ ! -z "$MOD_ZABBIXAG_LOCAL_KEY" ]; then
      decode $MOD_ZABBIXAG_LOCAL_KEY > $DAEMON_TMP/local.key
      echo "TLSKeyFile=$DAEMON_TMP/local.key"           >> $DAEMON_CONFIG
    fi
    if [ ! -z "$MOD_ZABBIXAG_TIMEOUT" ]; then
      echo "Timeout=$MOD_ZABBIXAG_TIMEOUT" >> $DAEMON_CONFIG
    fi

    LIST_TO_JSON="awk '"'BEGIN {print "["}; NR>1 {print ","}; {print "{\"item\":\"" $0 "\"}"}; END {print "]"}'"'"
    echo "UserParameter=vfs.settings.discovery,ls /etc/settings.* /opt/*/etc/settings | $LIST_TO_JSON" >> $DAEMON_CONFIG
    EXTRACT_VALUE="awk -F= '/^\$2=/{print \$\$2}'"
    echo "UserParameter=vfs.settings.value[*],$EXTRACT_VALUE /etc/settings.\$1" >> $DAEMON_CONFIG
    echo "UserParameter=vfs.settings.umod[*],$EXTRACT_VALUE /opt/\$1/etc/settings" >> $DAEMON_CONFIG
    # append custom items
    I=0
    while true; do
      I=$((I+1))
      PREFIX=MOD_ZABBIXAG_PARAM${I}
      eval ENABLED='$'${PREFIX}_ENABLED
      [ -z $ENABLED ] && break
      [ $ENABLED = 1 ] || continue
      eval KEY='$'${PREFIX}_KEY
      eval COMMAND='$'${PREFIX}_COMMAND
      echo "UserParameter=$KEY,$COMMAND"                >> $DAEMON_CONFIG
    done

    $DAEMON_BIN/$DAEMON_NAME -c $DAEMON_CONFIG 2>/dev/null
    RETVAL=$?
    if [ $RETVAL = 0 ]; then echo "done"; else echo "failed"; fi
    exit $RETVAL
  ;;

  stop)
    echo -n "Stopping module $MOD_NAME: "
    killall $DAEMON_NAME 2>/dev/null
    RETVAL=$?
    if [ $RETVAL = 0 ]; then echo "done"; else echo "failed"; fi
    exit $RETVAL
  ;;

  status)
    echo -n "Module $MOD_NAME is "
    killall -0 $DAEMON_NAME 2>/dev/null
    RETVAL=$?
    if [ $RETVAL = 0 ]; then
      echo "running"
    else
      if [ "$MOD_ZABBIXAG_ENABLED" != "1" ]; then
        echo "disabled"
      else
        echo "stopped"
      fi
    fi
    exit $RETVAL
  ;;

  defaults)
    cp $MOD_DEFAULTS $MOD_SETTINGS 2>/dev/null
    [ -f "$MOD_DEFAULTS.hash" ] && cp $MOD_DEFAULTS.hash $MOD_SETTINGS.hash
    exit 0
  ;;

  *)
    echo "Usage: $0 {start|stop|restart|status|defaults}"
    exit 1
  ;;

esac
